using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.Negocios;
using SIOGDE.Negocios.Servicios;
using Didsoft.Mvc.DataModel;
using Didsoft.Mvc.Controller;
using Didsoft.Mvc.DataModel.Lites;
using SIOGDE.AccesoDatos.Entidades.Lites;

namespace SIOGDE.Web.Controllers
{
    public class UnidadMilitarController : BaseController<UnidadMilitar>
    {
	    #region interface servicios UnidadMilitar

		private IUnidadMilitarNegociosServicio servicio = BusinessFactory.Current.GetUnidadMilitarNegocios();

		#endregion
		
		
		#region constructor and overridable

        public UnidadMilitarController()
        {		    
            base.SetDataModelService(servicio);            
        }
		        

		

		#endregion


        #region dropdown unidades padres

        [HttpPost]
        public JsonResult JSONGetUnidadesPadres()
        {
            try
            {
                List<KeyValueLite> datas = new List<KeyValueLite>();
               
                    datas = Service.ObtenerTodas().Where(p=>!p.AceptaEntradas).Select(c => new
                    KeyValueLite
                    {
                        DisplayText = c.Nombre,
                        Value = c.Id.ToString()
                    }).ToList();


                    if (datas == null && AddEmptyOptionToDropDownList)
                    {
                        datas = new List<KeyValueLite>();
                        datas.Add(new KeyValueLite() { DisplayText = "Ninguno", Value = "0" });
                    }

                    if (AddEmptyOptionToDropDownList)
                        datas.Insert(0, new KeyValueLite() { DisplayText = "Ninguno", Value = "0" });

               

                return Json(new { Result = "OK", Options = datas });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }

        #endregion

        #region	actions

        [HttpGet]
		public override ActionResult Index()
        {
            return RedirectToAction("FilterList");
        }

        [HttpGet]
        public ActionResult SLVisor()
        {
            return View();
        }

        [HttpGet]
        public ActionResult Mapa()
        {
            return View();
        }

        [HttpGet]
        public ActionResult VerEnMapa()
        {
            return View();
        }


        [HttpPost]
        public ActionResult GetMarcadores()
        {
            return Json(servicio.ObtenerTodas());
        }

        [HttpGet]
        public ActionResult Relacion()
        {
            return View();
        }

		#endregion


        #region unidades destino sugerentes

        public ActionResult VerSugerencias()
        {
            try
            {
                var opciones = servicio.GetOpcionesDeDestino();
                return View();
            }
            catch (Exception exe)
            {
                return RedirectToAction("NoEsPosibleSugerir", new { mensaje = exe.Message });
            }            
        }

        public ActionResult VerSugerenciasHtml()
        {
            return View();
        }

        public ActionResult Sugerencia()
        {
            try
            {
                var opciones = servicio.GetOpcionesDeDestino();
                return View(opciones);
            }
            catch (Exception ex)
            {
                return RedirectToAction("Info", "Persona", new { error = ex.Message });
                
            }            
        }

        public ActionResult NoEsPosibleSugerir(string mensaje = "")
        {
            ModelState.AddModelError("DataFormError", mensaje);
            return View();
        }

        [HttpPost]
        public JsonResult JTableGetSugerenciaJson(string filter = "", int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {                
                var items = servicio.GetOpcionesDeDestino().Skip(jtStartIndex).Take(jtPageSize).ToList();
                return Json(new { Result = "OK", Records = items, TotalRecordCount = items.Count });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }



        [HttpPost]
        public ActionResult GetSugerenciaJson()
        {
            return Json(servicio.GetOpcionesDeDestino());
        }


        public ActionResult Confirmar(string guidReq)
        {
            RequerimientoConfig config =  BusinessFactory.Current.GetRequerimientoConfigNegocios().GetPorGuid(guidReq);
            
            return View(config);
        }

        [HttpPost]
        public ActionResult Confirmar(string guidReq, string param)
        {
            try
            {
                var asignado = BusinessFactory.Current.GetDestinoAsignadoNegocios().GuardarDestinoElegido(guidReq);
                return RedirectToAction("ImprimirAsignacion", "Reporte", new { guidAsignacion = asignado.Guid });
            }
            catch (Exception)
            {
                return RedirectToAction("Info", "Persona");                
            }
        }

        #endregion

        #region treeView section

        public ActionResult TreeUnidadMilitar()
        {
            /*List<UnidadMilitar> unidades = new List<UnidadMilitar>();
            unidades = servicio.ObtenerTodas();
            var unidad = unidades.FirstOrDefault(p => p.UnidadPadre == null);
            SetUnidadesDependientes(unidad, unidades);*/
            return View(new UnidadMilitar());
        }

        private void SetUnidadesDependientes(UnidadMilitar unidad, List<UnidadMilitar> unidades)
        {
            var childs = unidades.
                            Where(x => x.UnidadPadreId_FK == unidad.Id).ToList();
            if (childs.Count > 0)
            {
                foreach (var child in childs)
                {
                    SetUnidadesDependientes(unidad, unidades);
                    unidad.Dependientes.Add(unidad);
                }
            }
        }
        
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UnidadesMilitares(string root)
        {
            int? unidadId = (root == "source") ? (int?)null : Convert.ToInt32(root);           

            IEnumerable<UnidadMilitar> children;
            if (unidadId == null)
            {
                children = servicio.ObtenerUnidadesRaiz();
            }
            else
            {
                children = servicio.ObtenerDependientes(unidadId.Value);
            }

            List<TreeViewNode> nodes = new List<TreeViewNode>();
            foreach (var child in children)
            {
                
                nodes.Add(new TreeViewNode()
                {
                    id = Convert.ToString(child.Id),
                    text = child.Nombre+"<a href='javascript:procesar("+child.Id+")'>Editar</a>",
                    classes = !child.TieneDependientes ? "file" : "folder",
                    hasChildren = child.TieneDependientes
                });
            }

            return Json(nodes);
        }


        public JsonResult JSONCargarDeTreeView(ParamId parame)
        {
            try
            {
                var unidadMilitar = servicio.ObtenerPorId(parame.Id);

                return Json(new { Result = "OK", Record = unidadMilitar });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        #endregion

    }


    public class TreeViewNode
    {
        public TreeViewNode()
        {

        }

        public TreeViewNode[] children { get; set; }
        public string classes { get; set; }
        public bool expanded { get; set; }
        public bool hasChildren { get; set; }
        public string id { get; set; }
        public string text { get; set; }
    }


}

